﻿using cs_dame.View;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace cs_dame.Model
{
    class Spielstand : ISpielstand
    {
        private Spielsteine[][] feld;
        private int chossenFeldx = -1;
        private int chossenFeldy = -1;
        private int groesse;
        private IGUIView gui;
        private bool iswhite = true;
        private String ereigniss;

        public Spielstand(int groesse, IGUIView gui)
        {
            this.gui = gui;
            feld =  new Spielsteine [groesse][];
            this.getGröße = groesse;
            int start = 0;
            int ende = 0; 
            if(groesse == 8){
                start = 3;
                ende = 4;
            }
            if(groesse == 10)
            {
                start = 3;
                ende = 6;
            }
            for (int i = 0; i < groesse; i++)
            {
                feld[i] = new Spielsteine [groesse];
            }
            for (int i = 0; i < groesse; i++)
            {
                for (int j = 0; j < groesse; j++)
                {
                    if (i< start)
                    {
                        if (i % 2 == 0)
                        {
                            if (j % 2 == 1)
                            {
                                feld[i][j] = Spielsteine.STEINWEISS;
                            }
                            else
                            {
                                feld[i][j] = Spielsteine.FREI;
                            }
                        }
                        else
                        {
                            if (j % 2 == 0 )
                            {
                                feld[i][j] = Spielsteine.STEINWEISS;
                            }
                            else
                            {
                                feld[i][j] = Spielsteine.FREI;
                            }
                        }
                        
                    }
                    if(i >= start && i <= ende){
                        feld [i] [j] = Spielsteine.FREI;
                    }
                    if (i > ende )
                    {
                        if (i % 2 == 0)
                        {
                            if (j % 2 == 1)
                            {
                                feld[i][j] = Spielsteine.STEINSCHWARZ;
                            }
                            else
                            {
                                feld[i][j] = Spielsteine.FREI;
                            }
                        }
                        else
                        {
                            if (j % 2 == 0)
                            {
                                feld[i][j] = Spielsteine.STEINSCHWARZ;
                            }
                            else
                            {
                                feld[i][j] = Spielsteine.FREI;
                            }
                        }

                    }
                }
            }
        }


        public Spielsteine [][] Spielfeld{
            set { this.feld = value;}
            get { return this.feld; }
        }
        public int getGröße
        {
            set { this.groesse = value; }
            get { return this.groesse; }
        }
        public bool SpielerZieht
        {
            set { this.iswhite = value; }
            get { return this.iswhite; }
        }

        public Spielsteine getFeldStatus(int x, int y)
        {
            if (x == -1 || y == -1) return Spielsteine.UNERREICHBAR;
            try
            {
                return this.feld[x][y];
            }
            catch (Exception e)
            {
                return Spielsteine.UNERREICHBAR;
            }
        }

        public void setStartFeld(int x, int y)
        {
            this.chossenFeldx = x;
            this.chossenFeldy = y;
            BenachtrichtigeView();
        }

        public void setAlsFrei(int x, int y)
        {
            feld[x][y] = Spielsteine.FREI;
            BenachtrichtigeView();
        }

        public void setZielFeld(int x, int y)
        {
            if (this.SpielerZieht && x == 7 && feld[chossenFeldx][chossenFeldy].Equals(Spielsteine.STEINWEISS))
            {
                feld[x][y] = Spielsteine.DAMEWEISS;
            }
            else if (!this.SpielerZieht && x == 0 && feld[chossenFeldx][chossenFeldy].Equals(Spielsteine.STEINSCHWARZ))
            {
                feld[x][y] = Spielsteine.DAMESCHWARZ;
            }
            else
            {
                feld[x][y] = feld[chossenFeldx][chossenFeldy];
            }
            BenachtrichtigeView();
        }
        public override string ToString()
        {
            for (int i = 0; i < feld.Length; i++)
            {
                for (int j = 0; j < feld[i].Length; j++)
                {
                    Console.Write(feld[i][j]+" ");
                }
                Console.WriteLine("\n");
            }
             return "";
        }
        public void BenachtrichtigeView()
        {
            int[] SelectedFeld = new int[2];
            SelectedFeld[0] = chossenFeldx;
            SelectedFeld[1] = chossenFeldy;
            gui.SetChange(feld, iswhite, SelectedFeld,this.ereigniss);
        }

        public int[] GetStartfeld()
        {
            return new int[] { this.chossenFeldx, this.chossenFeldy };
        }

        public int getGroesse()
        {
            return getGröße;
        }

        public void setEreigniss(String s){
            this.ereigniss = s;
            BenachtrichtigeView();
        }

    }
    public enum Spielsteine { STEINSCHWARZ, STEINWEISS, DAMESCHWARZ, DAMEWEISS, FREI, UNERREICHBAR };
}
